lexer grammar ReportLexer;


OPER : '+'
		 | '-'
		 | '*'
		 | '/'
		 | '%'
		 ;
		
OP : '>'
   | '<' 
   | '=='
   | '!='
   | '>='
   | '<='
   | 'in'
   | 'not in'
   | 'like'
   ;

CELL : LET DIG+ ;

ORDER : 'desc' | 'asc' ;

BOOLEAN : 'true' | 'false' ;

COLON : ':';

COMMA : ',' ;

NULL : 'null';

LeftP : '(' ;

RightP : ')' ;

COLUMN : '`' COLUMNCHAR* '`';

STRING : '\'' CONTENT '\''
	   ;

AND : 'and' | '&&' ;

OR : 'or' | '||' ;

INT : ('-')? DIG+;

NUMBER
:
	'-'? DIG+ '.' DIG+  // 0.3, -4.5
	| '-'? DIG+ // -3, 45
;

NOT : '!';

IDEN : SChar CHAR* ;

LET : [A-Z]+ ;

CHAR    :   SChar
            | '_' | DIG
            |   '\u00B7'
            |   '\u0300'..'\u036F'
            |   '\u203F'..'\u2040'
            ;

DIG : [0-9];

CHINAMARKS
    : '\u2018' | '\u2019' | '\u201c' | '\u201d'
    | '\u2013' | '\u2014' | '\u3001'
    | '\uFF00'..'\uFF0F'
    | '\uFF1A'..'\uFF20'

;

fragment
COLUMNCHAR
    : CHAR
    | '_' | '-' | '[' | ']' | '.' | DIG
    | '\u00A0' | '\u0020' | '\u3000'
;

fragment
CONTENT :
	( ESCAPE | ~('"'|'\''))*
;

fragment
ESCAPE
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'"'|'\''|'\\')
    |   UNICODE
    |   OCTAL
    ;

fragment
OCTAL
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE
:
	'\\' 'u' HEX HEX HEX HEX
;

fragment
HEX
:
	[0-9a-fA-F]
;

fragment
SChar
            :   [a-zA-Z]
            |   '\u2070'..'\u218F'
            |   '\u2C00'..'\u2FEF'
            |   '\u3001'..'\uD7FF'
            |   '\uF900'..'\uFDCF'
            |   '\uFDF0'..'\uFEFE'
            |   '\uFF10'..'\uFF19'
            |   '\uFF21'..'\uFFFF'
            ;

WS
:
	[ \t\r\n]+ -> channel(HIDDEN)
;
 
NL
:
    '\r'? '\n' ->channel(HIDDEN)
;
